package com.ma.array;

import java.util.*;

/**
 * @ClassName SolutionTwoSum
 * @Author: mayongqiang
 * @DATE 2022/3/29 10:53
 * @Description:
 */
public class SolutionTwoSum {

}

//设计一个类，拥有两个 API
interface TwoSum {
    // 向数据结构中添加一个数 number
    public void add(int number);

    // 寻找当前数据结构中是否存在两个数的和为 value
    public boolean find(int value);
}
/*
这样sum中就储存了所有加入数字可能组成的和，每次find只要花费 O(1) 的时间在集合中判断一下是否存在就行了，显然非常适合频繁使用find的场景。
 */
class TwoSum2 implements TwoSum {


    Set<Integer> sum = new HashSet<>();
    List<Integer> nums = new ArrayList<>();

    @Override
    public void add(int number) {
        for (int n : nums) {
            sum.add(n + number);
        }
        nums.add(number);

    }

    @Override
    public boolean find(int value) {
        return sum.contains(value);
    }
}

/*
对于频繁使用find方法的场景，我们可以进行优化。借助哈希集合来针对性优化find方法
 */
class TwoSum1 implements TwoSum {

    private Map<Integer, Integer> freq = new HashMap<>();

    @Override
    public void add(int number) {
        freq.put(number, freq.getOrDefault(number, 0) + 1);
    }

    @Override
    public boolean find(int value) {
        for (Integer key : freq.keySet()) {
            int other = value - key;
            // other==key  此时查看是否大于一个该元素
            if (other == key && freq.get(key) > 1) {
                return true;
            }
            if (other != key && freq.get(key) > 0) {
                return true;
            }
        }
        return false;
    }
}